package wei.xinya.core.map;

import java.util.*;

public class FindMore {
    public static void main(String[] args) {
        fin_10_max();
    }

    private static void fin_10_max() {
        //把100000个数放进ArrayList类型的容器
        ArrayList<Integer> arrayList = new ArrayList<>();
        Random random = new Random();
        //随机插入十万个数据
        for (int i = 0; i < 100000; i++) {
            int val = random.nextInt(10000) + 1;
            arrayList.add(val);
        }

        //重写比较器，目的是为了比较的hashMap中的value
        Comparator<Map.Entry<Integer, Integer>> comparator = Comparator.comparingInt(Map.Entry::getValue);

        //创建一个优先级队列的对象。自定义构造函数，则比较器需要重写，大小设为10
        PriorityQueue<Map.Entry<Integer, Integer>> priorityQueue = new PriorityQueue<>(10, comparator);

        //创建一个hashMap对象，（需要记录数以及他的出现次数）
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        //迭代器迭代arrayList，记录每个值出现的次数
        for (Integer next : arrayList) {
            if (hashMap.containsKey(next)) {
                //记录数据
                hashMap.put(next, hashMap.get(next) + 1);
            } else {
                //这个值第一次出现
                hashMap.put(next, 1);
            }
        }

        //迭代器迭代hashMap
        for (Map.Entry<Integer, Integer> next : hashMap.entrySet()) {
            int value = next.getValue();  //得到每一次遍历时的value值
            //如果优先级队列里的数据长度小于10，就往进添加
            if (priorityQueue.size() < 10) {
                priorityQueue.add(next);
            } else {
                //如果数据超过10，比较队顶的元素和要进入的元素
                if (priorityQueue.peek().getValue() < value) {
                    //如果要进入的元素大于队顶的元素，就移除队顶本来的元素，加入新的元素
                    priorityQueue.remove();
                    priorityQueue.add(next);
                }
            }
        }

        //迭代器遍历优先级队列，得出结果
        System.out.println("数字 出现次数");
        for (Map.Entry<Integer, Integer> next : priorityQueue) {
            int key = next.getKey();
            int value = next.getValue();
            System.out.println(key + "   " + value);
        }
    }
}
